from selenium import webdriver      # webdriver传入浏览器对象，启用自动化

from selenium.webdriver.common.by import By     # 定位元素模块


# 调用 webdriver 指定浏览器，需要下载对应的浏览器驱动。

web = webdriver.Edge()

web = webdriver.Chrome()

# 可传入驱动的存放位置,帮助webdriver更基准的启动
web = webdriver.Firefox(f'D:\Text_A_Jin\Python3.10.4')


'''选择元素的方法'''
# 使用 find_element 选择一个元素，如元素不存在，则抛出异常
web.find_element(By.ID, '')

# 使用 find_elements 选择多个元素，如元素不存在，则返回空列表
web.find_element(By.ID, '')


'''定位元素的八大方法'''
# 1.通过元素 ID 定位元素
web.find_element(By.ID, "**")       # 在单引号中填写前端元素的id值

# 2.根据 name 定位元素
web.find_element(By.NAME, "**")      # 在单引号中填写前端元素的name值

# 3.根据前端的class名称来定位元素
web.find_element(By.CLASS_NAME, "**")  # 在单引号中填写前端元素的class名称的值

# 4.根据html标签名来定位元素
web.find_element(By.TAG_NAME, "div")  # 在单引号中填写前端元素的html标签

# 5.根据页面上的文本超链接进行定位
web.find_element(By.LINK_TEXT, "测试")    # 在单引号中填写页面上看到的文本超链接文字

# 6.模糊搜索页面上的文本超链接进行定位
web.find_element(By.PARTIAL_LINK_TEXT, '**')  # 在单引号中填写看到的文本超链接文字

# 7.根据 CSS 选择器来定位元素
web.find_element(By.CSS_SELECTOR, "**")  # 在单引号中填写css表达式

# 8.根据 xpath 选择器来定位元素
web.find_element(By.XPATH, '**')     # 在单引号中填写xpath表达式


'''
         CSS 选择器表达式
选择器中的表达式可以混写，可以多多尝试
    
'''
# 1.使用选择器中的 # 号来表示id属性
web.find_element(By.CSS_SELECTOR, '#id')  # 值的前面跟 # 代表该值为id

# 2.使用选择器中的 . 来表示class属性
web.find_element(By.CSS_SELECTOR, '.primary')  # 值的前面跟 . 表示该值值为元素的class

# 3.使用选择器中的 > 表示元素的父子关系，必须为当前元素的下一层子元素
web.find_element(By.CSS_SELECTOR, 'div>span')    # div 下面一层的 span 标签

# 4.使用选择器中的 空格 表示元素中的包含关系
web.find_element(By.CSS_SELECTOR, 'div span')    # div 下层的 span，不管中间有几层都可以选到

# 5.使用选择器中的 + 表示兄弟关系
web.find_element(By.CSS_SELECTOR, 'div+span')   # div同一层级的一个span

# 6.使用选择器中的 ~ 表示一个标签中所有的兄弟标签
web.find_element(By.CSS_SELECTOR, 'span ~ div')  # 与span同级的所有标签

# 7.使用选择器中的 , 表示同时满足两个条件
web.find_element(By.CSS_SELECTOR, '.primary,div')  # class属性为primary同时又是div标签元素

# 8.当一个元素没有id/name/class时可以使用 [] 来选择其他的属性值
web.find_element(By.CSS_SELECTOR, '[rel="stylesheet"]')  # 需要把属性的键值对全部输入，才可定位

# 9.使用选择器中的 * 号，来表示 [ ] 包含关系
web.find_element(By.CSS_SELECTOR, '[rel*="st"]')  # rel键中包含st值的元素

# 10.使用选择器中的 ^ 号，来表示 [ ] 开头关系
web.find_element(By.CSS_SELECTOR, '[rel^="st"]')  # rel键中开头是st值的元素

# 11.使用选择器中的 & 号，来表示 [ ] 结尾关系
web.find_element(By.CSS_SELECTOR, '[rel&="eet"]')  # rel键中结尾是eet值的元素

# 12.使用选择器中的 :nth-child() 表示某一元素的父类下的第几个子元素
web.find_element(By.CSS_SELECTOR, 'div:nth-child(2)')   # 表示某父类元素下第二个div的子元素
# 选择 section 下的第一个 ul 标签
web.find_element(By.CSS_SELECTOR, 'section>ul:nth-child(1)')

# 13.使用选择器中的 :nth-last-child() 表示某一个元素父类下的倒数第几个子元素
# 表示某父类元素下倒数第二个div的子元素
web.find_element(By.CSS_SELECTOR, 'div:nth-last-child(2)')
# 选择 section 下的倒数第一个 ul 标签
web.find_element(By.CSS_SELECTOR, 'section>ul:nth-last-child(1)')

# 14.使用选择器中的 :nth-of-type() 表示某一元素的父类下的第几个元素
web.find_element(By.CSS_SELECTOR, 'div:nth-of-type(2)')   # 表示某父类元素下第二个div的元素
# 选择 section 下的第一个 ul 标签
web.find_element(By.CSS_SELECTOR, 'section>ul:nth-of-type(1)')

# 15.使用选择器中的 :nth-last-of-type() 表示某一个元素父类下的倒数第几个元素
# 表示某父类元素下倒数第二个div的元素
web.find_element(By.CSS_SELECTOR, 'div:nth-last-of-type(2)')
# 选择 section 下的倒数第一个 ul 标签
web.find_element(By.CSS_SELECTOR, 'section>ul:nth-last-of-type(1)')

'''混写思路'''
# class属性包含TableComponent的标签下的元素标签是tbody下的第一个tp标签里面的span标签同时class属性是checkbox-label
web.find_element(
    By.CSS_SELECTOR, '[class*="TableComponent"] tbody>tr:nth-child(1) span.checkbox-label')
